package cn.hacynn.nd.controller;


import cn.hacynn.nd.common.properties.OssProperties;
import cn.hacynn.nd.common.result.Result;
import cn.hacynn.nd.pojo.dto.CreateDirDTO;
import cn.hacynn.nd.pojo.dto.FileRenameDTO;
import cn.hacynn.nd.pojo.dto.FileUrlDTO;
import cn.hacynn.nd.pojo.dto.SaveFileDTO;
import cn.hacynn.nd.pojo.entity.File;
import cn.hacynn.nd.pojo.vo.DownloadListVO;
import cn.hacynn.nd.pojo.vo.FileDetailVO;
import cn.hacynn.nd.pojo.vo.FileSpaceVO;
import cn.hacynn.nd.service.FileService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * @Author Hacynn
 * @Date 2024/5/25 17:19
 * @Version 1.0
 */
@RestController
@RequestMapping("/file")
@Slf4j
public class FileController {

    @Autowired
    private FileService fileService;

    @Autowired
    private OssProperties ossProperties;

    /**
     * 获取当前用户文件列表信息
     * @return
     */
    // TODO 需要优化成分页查询
    @GetMapping("/list")
    public Result<List<File>> list(@RequestParam(defaultValue = "") String prefix) {  // 路径默认为空
        log.info("获取文件列表，当前所在路径:{}",prefix);
        List<File> files = fileService.list(prefix);
        return Result.success(files);
    }

    /**
     * 获取用户总空间容量以及使用容量
     * @return
     */
    @GetMapping("/space")
    public Result<FileSpaceVO> space() {
        FileSpaceVO fileSpaceVO = fileService.getFileSpace();
        //呈现给用户具体的数值
        return Result.success(fileSpaceVO);
    }

    /**
     * 新建文件夹
     * @param createDirDTO
     * @return
     */
    @PostMapping("/createDir")
    public Result createDir(@ModelAttribute CreateDirDTO createDirDTO) {   // @RequestParam只能接收单个参数，不能接收复杂对象；应该使用@ModelAttribute接收复杂对象
        log.info("新建文件夹;{}",createDirDTO);
        fileService.createDir(createDirDTO);
        return Result.success();
    }

    /**
     * 上传完成，保存文件/文件夹中文件的信息
     * @param saveFileDTO
     * @return
     */
    @PostMapping("/saveFile")
    public Result saveFile(@RequestBody SaveFileDTO saveFileDTO) {
        log.info("保存文件信息:{}", saveFileDTO);
        fileService.saveFile(saveFileDTO);
        return Result.success();
    }

    /**
     * 将文件移入回收站
     * @param ossPath
     * @return
     */
    @PostMapping("/trashBin")
    public Result moveToTrashBin(@RequestParam String ossPath) {
        log.info("将路径为‘{}’的文件移入回收站", ossPath);
        fileService.updateDeletedByOssPath(ossPath, true);
        return Result.success();
    }

    /**
     * 获取回收站中的文件列表信息
     * @return
     */
    @GetMapping("/list/trashBin")
    public Result<List<File>> trashBinList() {
        List<File> files = fileService.trashBinList();
        //给用户呈现文件列表信息
        return Result.success(files);
    }

    /**
     * 移出回收站，恢复文件
     * @param ossPath
     * @return
     */
    @PostMapping("/withdraw")
    public Result withdrawByTrashBin(@RequestParam String ossPath) {
        fileService.updateDeletedByOssPath(ossPath, false);
        return Result.success();
    }

    /**
     * 将回收站中的文件（或文件夹）彻底删除
     * @param filePath
     * @return
     */
    @PostMapping("/delete")
    public Result delete(@RequestParam String filePath) {
        log.info("将回收站中的文件（或文件夹）彻底删除，文件（或文件夹）路径:{}",filePath);
        fileService.delete(filePath);
        return Result.success();
    }

    /**
     * 清空回收站中的所有文件
     * @return
     */
    @PostMapping("/clear")
    public Result clear() {
        fileService.clearAllFiles();
        return Result.success();
    }

    /**
     * 文件重命名
     * @return
     */
    @PostMapping("/rename")
    public Result rename(@RequestBody FileRenameDTO fileRenameDTO) {
        log.info("文件重命名:{}",fileRenameDTO);
        fileService.rename(fileRenameDTO);
        return Result.success();
    }

    /**
     * 查看文件详情
     * @param ossPath
     * @return
     */
    @GetMapping("/detail")
    public Result<FileDetailVO> detail(@RequestParam String ossPath) {
        log.info("查看文件详情，文件路径:{}", ossPath);
        FileDetailVO VO =  fileService.detail(ossPath);
        return Result.success(VO);
    }

    /**
     * 获取预览地址（不同于分享地址）
     * @param fileUrlDTO
     * @return
     */
    @PostMapping("/preview-url")
    public Result<String> previewUrl(@RequestBody FileUrlDTO fileUrlDTO) {
        log.info("获取预览地址，请求信息:{}", fileUrlDTO);
        String url = fileService.previewUrl(fileUrlDTO);
        return Result.success(url);
    }

    /**
     * 文件下载
     * @param ossPath
     * @return
     */
    @PostMapping("/download")
    public Result<String> download(@RequestParam String ossPath) {  // TODO OSS的流式下载
        log.info("文件下载，下载路径:{}", ossPath);
        String url = fileService.download(ossPath);
        return Result.success(url);
    }

    /**
     * 文件夹下载（打包下载文件）
     * @param dirPath
     * @return
     */
    @PostMapping("/downloadDir")
    public Result<List<DownloadListVO>> downloadDir(@RequestParam(value = "objectPath") String dirPath) {
        log.info("文件夹下载（打包下载文件），要下载文件路径:{}", dirPath);
        //
        List<DownloadListVO> list = fileService.downloadDir(dirPath);
        return Result.success(list);
    }

    /**
     * 获取分享地址
     * @param fileUrlDTO
     * @return
     */
    @PostMapping("/share-url")
    public Result<String> shareUrl(@RequestBody FileUrlDTO fileUrlDTO) {
        log.info("获取分享地址，请求信息:{}", fileUrlDTO);
        String url = fileService.shareUrl(fileUrlDTO);
        return Result.success(url);
    }

}
